package cn.itcast.order.service;

import cn.itcast.feign.api.UserFeign;
import cn.itcast.order.Order;
import cn.itcast.order.mapper.OrderMapper;
import cn.itcast.user.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;

    /*
    order功能 与 user功能 分布在两个项目中,通过发起http请求,远程调用user-service接口,根据order中userId字段查询user数据


    - 在order-service服务中的OrderApplication启动类(启动类也是配置类)中注册一个RestTemplate的实例到Spring容器
    - 修改order-service服务中的OrderService类中的queryOrderById方法，根据Order对象中的userId查询User
    - 将查询的User填充到Order对象，一起返回
     */

    @Autowired
    private RestTemplate restTemplate;//RestTemplate是spring提供的用于按照Restful风格发起Http请求的类

    @Autowired
    private UserFeign userFeign;//Could not autowire. No beans of 'UserFeign' type found. 是因为UserClient现在在cn.itcast.feign.clients包下，而order-service的@EnableFeignClients注解是在cn.itcast.order包下，不在同一个包，无法扫描到UserClient。
    //解决扫描包问题
    //方式一：
    //指定Feign应该扫描的包：
    //@EnableFeignClients(basePackages = "cn.itcast.feign.clients")
    //
    //方式二：
    //指定需要加载的Client接口：
    //@EnableFeignClients(clients = {UserClient.class})

    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        //2.远程查询user

        /*//url地址
//        String url = "http://localhost:8081/user/"+order.getUserId();
        String url = "http://userservice/user/"+order.getUserId();//因为user-service服务已经在注册中心注册了,所以可以使用user-service服务的服务名替代ip:port来远程访问user-service服务,实现'微服务分布式架构'
        //发起调用
        User user = restTemplate.getForObject(url,User.class);*/

        /**
         * 使用Feign代替RestTemplate远程调用user-service
         */
        User user = userFeign.queryById(order.getUserId());

        //3.将user存入order
        order.setUser(user);
        // 4.返回
        return order;
    }
}
